// 动态加载脚本的函数
let callbacks = []

//检查是否成功下载了 TinyMCE 富文本编辑器的脚本
function loadedTinymce() {
  return window.tinymce
}

const dynamicLoadScript = (src, callback) => {
  //获取src所对应的脚本
  const existingScript = document.getElementById(src)
  const cb = callback || function () { }

  if (!existingScript) {
    //创建一个新的script元素即<script>
    const script = document.createElement('script')
    //为即将加载的第三方库或脚本创建一个唯一标识的 <script> 元素，并设置其来源 URL
    script.src = src
    script.id = src
    //将之前创建的 <script> 元素添加到网页的主体部分（<body>）中，以便加载其中包含的脚本文件或第三方库。
    document.body.appendChild(script)
    callbacks.push(cb)
    //决定浏览器是现代浏览器，还是IE浏览器
    const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd
    onEnd(script)
  }

  if (existingScript && cb) {
    if (loadedTinymce()) {
      cb(null, existingScript)
    } else {
      callbacks.push(cb)
    }
  }

  function stdOnEnd(script) {
    //当脚本加载成功时触发
    script.onload = function () {
      this.onerror = this.onload = null
      for (const cb of callbacks) {
        cb(null, script)
      }
      callbacks = null
    }
    //当脚本加载失败时触发。
    script.onerror = function () {
      this.onerror = this.onload = null
      cb(new Error('Failed to load ' + src), script)
    }
  }
  //ieOnEnd 函数主要是用于处理在老版本的 Internet Explorer 浏览器中，脚本加载成功的情况，确保在这种情况下能够执行相应的操作或回调函数。
  function ieOnEnd(script) {
    script.onreadystatechange = function () {
      if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
      this.onreadystatechange = null
      for (const cb of callbacks) {
        cb(null, script) // there is no way to catch loading errors in IE8
      }
      callbacks = null
    }
  }
}

export default dynamicLoadScript